% Architecture Manual
% utf-8
\documentclass[a4paper,10.5pt,footnote,chapter,amsmath, microtype]{xoblivoir}
\usepackage{fapapersize}
\usefapapersize{*,*,30mm,*,30mm,*}
%\setlength{\textwidth}{40em}
\setlength{\sidebarwidth}{20pt}
\setlength{\marginparwidth}{0pt}
\setlength{\oddsidemargin}{20pt}
\setlength{\evensidemargin}{20pt}
%\usepackage{malgm}
%\usepackage{hoze-illust}
\hypersetup{bookmarksnumbered,colorlinks=true}
\hypersetup{pdftitle=theCore Architecture Manual, pdfauthor=Kim\, Eunchan}

\disablekoreanfonts
\setmainfont[Mapping=tex-text]{나눔명조}
\setsansfont[Mapping=tex-text]{나눔고딕}
\setmonofont{나눔고딕코딩}
\setmonoscale{0.9}

\settocdepth{subsection}
\counterwithin{footnote}{chapter}
\setlength{\parskip}{1.2em plus 0.3em minus 0.2em}

\usepackage{fancyvrb}
%%%%%%%%%%%%%%%%%%%%%%%%%%
% script environment
%%%%%%%%%%%%%%%%%%%%%%%%%%
\DefineVerbatimEnvironment
	{syntax}{Verbatim}
	{baselinestretch=1.5}
\DefineVerbatimEnvironment
	{script}{Verbatim}
	{frame=single, baselinestretch=1,
	 fontsize=\footnotesize}
%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%
% Engine Style Command
%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\ekvars}{\textbf}
\newcommand{\ekcmd}{\emph}
%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%
% Table line 조정
\renewcommand{\arraystretch}{1.2}
%%%%%%%%%%%%%%%%%%%%%%%%%%

\title{theCore Architecture Manual}
\author{Kim, Eunchan, helpbygrace\#gmail.com}
\date{\today}
\pagestyle{ruled}

\makeindex
\def\contentsname{Contents}
\begin{document}
\thispagestyle{empty}
\maketitle

\tableofcontents*
\clearpage
\chapter*{Conventions}
\begin{center}\label{table:conventions}
	\begin{tabular*}{0.75\textwidth}{c|l}
	\textbf{Style} & \textbf{Description} \\ \hline
	\ekcmd{Command} & Assember 또는 기타 명령어를 지시할 때 사용됩니다. \\
	\ekvars{Variable} & 변수값을 지칭할때 사용됩니다. \\
	\end{tabular*}
\end{center}
\chapter{theCore}
\section{theCore 소개}
theCore 프로젝트는 2007년 12월에 시작되었습니다.
그 때 당시는 1년동안의 졸업작품을 위한 프로젝트로 아무것도 모르던 2명의 학부생이 팀을 이뤄 시작되었습니다.. 
초기 버전은 20여개의 명령어에 5단계 파이프라인을 지닌 코어였지만 내부 메모리도 없었고 명령어는 hard-coded 되어있었습니다.
겨우 DE2에서 돌아가는 것을 보이고 사장되었습니다.

2010년 초 두번째 theCore 버전이 시작되었습니다.
새로운 theCore 역시 5단계 파이프라인을 가지고 있으며, 32bit RISC입니다.
그러나 풍부한 명령어를 가지고 있고 고속으로 동작하기 위한 다양한 기법이 적용되었습니다.

\section{메모리 주소 접근 방법}\label{sec:address_interfacing}

theCore의 각 명령어는 종류에 따라 몇가지 정해진 접근 방법을 지닙니다.
예를 들면, \ekcmd{ADD} 명령어는 오퍼랜드(operand)로 3개의 레지스터를 받거나 2개의 레지스터와 한개의 상수를 받을 수 있습니다.
또한 \ekcmd{ld}는 메모리에서 값을 불러오는데, 이는 레지스터 값을 기준으로 displacement가 레지스터가 될 수도, 상수가 될 수도 있습니다.

\subsection{레지스터-to-레지스터}

\subsection{레지스터 + displacement}

\section{Conditions}\index{조건문}

theCore에는 두가지 조건방식을 사용할 수 있습니다.
COND는 PS의 N, Z, C, V를 이용하여 조건을 검사하는 방식입니다.
CONDZ는 register의 값을 0과 비교하여 조건을 검사합니다.
두 방식의 자세한 내용은 표 \ref{table:cond}, 표 \ref{table:condz}에 설명되어 있습니다.

\begin{table}[htbp]
\centering
	\begin{tabular*}{0.8\textwidth}{c|c|l}
	조건 		& bit code		& 설명				\\ \hline
	Z, EQ		& 0000		& equal or zero			\\ \hline
	NZ, NE	& 0001		& not zero or not equal	\\ \hline
	GT		& 0010		& greater than			\\ \hline
	LT		& 0011		& less than			\\ \hline
	GE 		& 0100		& greater than or equal	\\ \hline
	LE		& 0101		& less than or equal		\\ \hline
	AL		& 0110		& always				\\ \hline
	NO		& 0111		& no operation			\\ \hline
	N 		& 1000		& negative				\\ \hline
	NN		& 1001		& not negative			\\ \hline
	GTU		& 1010		& greater than unsigned	\\ \hline
	LTU		& 1011		& less than unsigned or not carry		\\ \hline
	GEU		& 1100		& greater than or equal unsigned or carry		\\ \hline
	LEU		& 1101		& less than or equal unsigned	\\ \hline
	V		& 1110		& overflow				\\ \hline
	NV		& 1111		& not overflow			\\
	\end{tabular*}
\bigskip
\caption{COND 조건 목록}\label{table:cond}
\end{table}

\begin{table}[htbp]
\centering
	\begin{tabular*}{0.8\textwidth}{c|c|l}
	조건 		& bit code		& 설명				\\ \hline
	Z, EQ		& 000			& equal or zero			\\ \hline
	NZ, NE	& 001			& not zero or not equal	\\ \hline
	GT		& 010			& greater than			\\ \hline
	LT		& 011			& less than			\\ \hline
	GE 		& 100			& greater than or equal	\\ \hline
	LE		& 101			& less than or equal		\\ \hline
	AL		& 110			& always				\\ \hline
	NO		& 111			& no operation			\\
	\end{tabular*}
\bigskip
\caption{CONDZ 조건 목록}\label{table:condz}
\end{table}

\section{theCore 파이프라인}

\chapter{Instruction Set Architecture}\label{ch:isa}

\section{논리 및 연산 명령어}\label{sec:arithmetic}\label{sec:logical}
\subsection{addi}\label{op:addi}\index{addi}
\subsubsection{명령어 형태}
\begin{table}[htbp]
\centering
	\begin{tabular*}{.97\linewidth}{
 		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		}
	31 & & & & & & & &23 &  & & & 19 & & & &15 & & & & & & & & & & & & & & & 0 \tabularnewline
%	\multicolumn{8}{l}{31} & \multicolumn{4}{l}{23} & \multicolumn{4}{l}{19} & \multicolumn{16}{l}{15}  \tabularnewline \hline
	\hline
	\multicolumn{1}{|@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{u} &
	\multicolumn{4}{@{}>{\centering}p{.12\linewidth}@{}|}{rd} &
	\multicolumn{4}{@{}>{\centering}p{.12\linewidth}@{}|}{rs} &
	\multicolumn{16}{@{}>{\centering}p{.48\linewidth}@{}|}{simm16}
	\tabularnewline
	\hline
	\end{tabular*}
\end{table}
\begin{table}[htbp]
\centering
	\begin{tabular*}{.97\linewidth}{
 		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}
		@{}>{\centering}p{.03\linewidth}@{}@{}>{\centering}p{.03\linewidth}@{}}
	31 & & & & & & & &23 &  & & & 19 & & & &15 & & & & & & & & & 6& &4 & & & & 0 \tabularnewline
	\hline
	\multicolumn{1}{|@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{0} &
	\multicolumn{1}{@{}>{\centering}p{.03\linewidth}@{}|}{u} &
	\multicolumn{4}{@{}>{\centering}p{.12\linewidth}@{}|}{rd} &
	\multicolumn{4}{@{}>{\centering}p{.12\linewidth}@{}|}{rs} &
	\multicolumn{9}{@{}>{\centering}p{.27\linewidth}@{}|}{simm9} &
	\multicolumn{2}{@{}>{\centering}p{.06\linewidth}@{}|}{sh} &
	\multicolumn{5}{@{}>{\centering}p{.15\linewidth}@{}|}{shamt}
	\tabularnewline
	\hline
	\end{tabular*}
\end{table}

\subsubsection{문법}
\begin{syntax}
addi{.u} rd, rs, simm16
addi{.u} rd, rs, shift(simm9,shamt)
\end{syntax}
\subsubsection{기능}
\begin{script}
% if shift 
switch(sh)
  {
    case 2'b 00: imm := shl(sext(simm9),shamt)
    case 2'b 01: imm := ror(sext(simm9),shamt)
    case 2'b 1x: imm := unpredictable
  }
% else
imm := sext(simm16)
% endif

$gpr[rd] := gpr[rs] + imm

if(u = 1)
  {
    ps.n := $gpr[rd][31]
    ps.z := ~($gpr[rd] = 0)
    ps.c := carry
    ps.v := overflow
  }
\end{script}
\subsubsection{예시}
\begin{syntax}
addi r1, r3, shl(-7,1)
addi.u r1, r2, ror(0x1FF,4)
addi r1, r2, 0xFEDC
addi r1, r2, -32000
\end{syntax}

\subsubsection{설명}
simm9, simm16은 signed extended되어 32비트로 변환됩니다.
그 후 simm9는 shift명령에의해 shifted되어 rs와 덧셈 연산을 수행합니다.
simm16은 shift 연산되지 않고 바로 rs와 덧셈연산을 수행하여 rd에 결과가 저장됩니다.
만일 update flag인 u가 1이라면 ps 레지스터에 결과값에 대한 NZCV 상태가 저장됩니다.


\section{메모리 읽기 \/ 쓰기 명령어}\label{sec:load}\label{sec:store}

\section{분기 명령어}\label{sec:branch}

\section{Co-processor 명령어}\label{sec:cop}

\section{특수기능 명령어}\label{sec:sp}

\printindex

\end{document}